import type { HttpResponseInterceptor } from '@/config/httpClient/HttpInterceptor.ts'
import { AxiosError, type AxiosResponse } from 'axios'


/**
 * 通用错误处理
 *
 * 对于所有被 `validateStatus` 视为失败的请求, 统一在这里处理
 *
 * 规则大概为:
 *
 * 状态码 ∈ [400, 500): 提示客户端, 所以大部分服务端自定义错误码都应该以 400+ 错误码响应
 *
 * 状态码 ∈ [500, ∞): 提示服务器错误, 并记录错误. 500+ 表示由于服务不可用 或服务端错误导致无法继续的糟糕体验
 */
export class GeneralErrorProcessor implements HttpResponseInterceptor {

    onRejected(error: any): Promise<any> {
        // 非 AxiosError 原样返回, 不处理
        if (!error || !(error instanceof AxiosError)) {
            return Promise.reject(error)
        }
        const status = error.response?.status ?? -1
        const data = error.response?.data

        // 处理 400 ~ 499
        if (status < 500) {
            if (typeof data === 'string') {
                console.warn(data)
            }
            // 服务端通用错误响应结构处理
            if (typeof data === 'object') {
                console.warn(data.message || data)
            }
        }

        if (status > 500) {
            console.error(data)
        }

        return Promise.reject(data)
    }

    onFulfilled(response: AxiosResponse): AxiosResponse | Promise<AxiosResponse> {
        return Promise.resolve(response)
    }

}
